home *** CD-ROM | disk | FTP | other *** search
/ PC User 2004 August / Disc 1 / PCU0804CD1.iso / software / browsers / files / opera1.exe / OPERA.JAR / com / opera / OperaInputStream.class (.txt) < prev    next >
Encoding:
Java Class File  |  2004-02-12  |  4.0 KB  |  206 lines

  1. package com.opera;
  2.  
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.io.InterruptedIOException;
  6. import java.util.Enumeration;
  7. import java.util.Hashtable;
  8.  
  9. public class OperaInputStream extends InputStream {
  10.    private static final int BUFFER_SIZE = 32768;
  11.    private static Hashtable stream_map = new Hashtable();
  12.    private static int next_stream_id = 0;
  13.    private int protocol_response = -1;
  14.    private byte[] buffer = new byte['ΦÇÇ'];
  15.    private int next_read = 0;
  16.    private int last_avail = -1;
  17.    private int available = 0;
  18.    private int total_input = 0;
  19.    private int content_len = -1;
  20.    private int stream_id = -1;
  21.    private boolean header_loaded = false;
  22.    private boolean eof_state = false;
  23.    protected Hashtable header_fields = new Hashtable();
  24.  
  25.    protected OperaInputStream() {
  26.    }
  27.  
  28.    public int getResponse() {
  29.       return this.protocol_response;
  30.    }
  31.  
  32.    public int available() {
  33.       synchronized(this) {
  34.          return this.available;
  35.       }
  36.    }
  37.  
  38.    public int read() throws IOException {
  39.       synchronized(this) {
  40.          while(this.available == 0 && !this.eof_state) {
  41.             try {
  42.                this.starving();
  43.                this.wait();
  44.             } catch (InterruptedException var4) {
  45.                this.eof_state = true;
  46.                this.available = 0;
  47.                Thread.currentThread().interrupt();
  48.                throw new InterruptedIOException();
  49.             }
  50.          }
  51.  
  52.          if (this.available == 0 && this.eof_state) {
  53.             this.buffer = null;
  54.             return -1;
  55.          } else {
  56.             --this.available;
  57.             if (this.next_read == 32768) {
  58.                this.next_read = 0;
  59.             }
  60.  
  61.             return 255 & this.buffer[this.next_read++];
  62.          }
  63.       }
  64.    }
  65.  
  66.    public void headerLoaded(int var1, int var2) {
  67.       synchronized(this) {
  68.          if (var1 == 0) {
  69.             var1 = -1;
  70.          }
  71.  
  72.          this.content_len = var1;
  73.          this.protocol_response = var2;
  74.          this.header_loaded = true;
  75.          this.notifyAll();
  76.       }
  77.    }
  78.  
  79.    public int getContentLength() {
  80.       synchronized(this) {
  81.          while(!this.header_loaded) {
  82.             try {
  83.                this.wait();
  84.             } catch (InterruptedException var4) {
  85.             }
  86.          }
  87.  
  88.          return this.content_len;
  89.       }
  90.    }
  91.  
  92.    public void setEOF() {
  93.       synchronized(this) {
  94.          this.eof_state = true;
  95.          this.notifyAll();
  96.       }
  97.    }
  98.  
  99.    void signalStream() {
  100.       synchronized(this) {
  101.          this.notifyAll();
  102.       }
  103.    }
  104.  
  105.    public int addInput(byte[] var1) {
  106.       int var2 = 0;
  107.       int var3 = 0;
  108.       synchronized(this) {
  109.          try {
  110.             if (this.eof_state) {
  111.                this.notifyAll();
  112.                byte var10000 = -1;
  113.                return var10000;
  114.             }
  115.  
  116.             if (var1.length > 0 && this.available < 32768) {
  117.                int var5 = 'ΦÇÇ' - this.available;
  118.                if (this.last_avail < 32767) {
  119.                   if (var1.length < 'ΦÇÇ' - this.last_avail) {
  120.                      var2 = var1.length;
  121.                   } else {
  122.                      var2 = 'ΦÇÇ' - this.last_avail - 1;
  123.                   }
  124.  
  125.                   if (var2 > var5) {
  126.                      var2 = var5;
  127.                   }
  128.  
  129.                   System.arraycopy(var1, 0, this.buffer, this.last_avail + 1, var2);
  130.                }
  131.  
  132.                var5 -= var2;
  133.                if (var5 > 0) {
  134.                   if (var1.length - var2 > var5) {
  135.                      var3 = var5;
  136.                   } else {
  137.                      var3 = var1.length - var2;
  138.                   }
  139.  
  140.                   System.arraycopy(var1, var2, this.buffer, 0, var3);
  141.                }
  142.  
  143.                this.last_avail = (this.last_avail + var2 + var3) % 'ΦÇÇ';
  144.             }
  145.  
  146.             this.notifyAll();
  147.          } catch (ArrayIndexOutOfBoundsException var7) {
  148.             var7.printStackTrace(System.err);
  149.          }
  150.  
  151.          this.available += var2 + var3;
  152.          this.total_input += var2 + var3;
  153.          return var2 + var3;
  154.       }
  155.    }
  156.  
  157.    protected static int addStream(OperaInputStream var0) {
  158.       synchronized(stream_map) {
  159.          stream_map.put(new Integer(next_stream_id), var0);
  160.          var0.stream_id = next_stream_id++;
  161.       }
  162.  
  163.       return var0.stream_id;
  164.    }
  165.  
  166.    protected static void removeStream(int var0) {
  167.       synchronized(stream_map) {
  168.          stream_map.remove(new Integer(var0));
  169.       }
  170.  
  171.       OperaOutputStream.removeStream(var0);
  172.    }
  173.  
  174.    protected static OperaInputStream getStream(int var0) {
  175.       synchronized(stream_map) {
  176.          return (OperaInputStream)stream_map.get(new Integer(var0));
  177.       }
  178.    }
  179.  
  180.    private native void starving();
  181.  
  182.    private void addHeader(String var1, String var2) {
  183.       this.header_fields.put(var1.toLowerCase(), var2);
  184.    }
  185.  
  186.    protected static void signalStreams() {
  187.       Enumeration var0 = stream_map.elements();
  188.  
  189.       while(var0.hasMoreElements()) {
  190.          Object var1 = var0.nextElement();
  191.          synchronized(var1) {
  192.             var1.notifyAll();
  193.          }
  194.       }
  195.  
  196.    }
  197.  
  198.    protected boolean isHeaderLoaded() {
  199.       return this.header_loaded;
  200.    }
  201.  
  202.    private int writeReady() {
  203.       return 'ΦÇÇ' - this.available;
  204.    }
  205. }
  206.